﻿using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web;
using PagSeguro.Mvc.Extensions;
using System.Text;
using System.Net;
using System.IO;
using PagSeguro.Mvc.Recursos;

namespace PagSeguro.Mvc
{
    /// <summary>
    /// Retorno automático com os dados da transação.
    /// </summary>
    public class RetornoAutomatico
    {
        /// <summary>
        /// Requisição enviada do retorno automático do PagSeguro.
        /// </summary>
        private HttpRequestBase _request;

        /// <summary>
        /// Informações da transação do PagSeguro
        /// </summary>
        public Transacao Transacao { get; set; }

        /// <summary>
        /// Construtor padrão.
        /// </summary>
        /// <param name="request">Requisição enviada pelo PagSeguro.</param>
        internal RetornoAutomatico(HttpRequestBase request) 
        {
             _request = request;
            this.Transacao = new Transacao(request.Form);
        }

        /// <summary>
        /// Efetua a validação da transação com o PagSeguro garantindo a segurança das informações trafegadas.
        /// </summary>
        /// <param name="token">Token de segurança gerado pela sua conta de vendedor no PagSeguro.</param>
        /// <param name="urlNPI">
        /// Opcional: Url para validar a transação com o PagSeguro. Só informe uma nova url caso precise efetuar testes locais.
        /// </param>
        /// <returns>Resultado da validacao</returns>
        public ResultadoDaValidacao Validar(string token, string urlNPI = "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml")
        {
            if (String.IsNullOrWhiteSpace(token))
                throw new ArgumentException("token");

            //// Efetua o decode dos dados da transação, como informa a documentação do PagSeguro.
            _request.ContentEncoding = Encoding.GetEncoding(Constantes.ENCODING);
            var urlDecoded = HttpUtility.UrlDecode(_request.Form.ToString(), Encoding.GetEncoding(Constantes.ENCODING));

            // Adiciona os novos parâmetros que serão enviados;
            string dadosDoPost = String.Format("{0}&Comando=validar&Token={1}", urlDecoded, token);
            
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlNPI);

                // Configura a requisição
                req.Method = "POST";
                req.ContentLength = dadosDoPost.Length;
                req.ContentType = String.Format("application/x-www-form-urlencoded");

                // Envia
                StreamWriter stOut =
                    new StreamWriter(req.GetRequestStream(), Encoding.GetEncoding(Constantes.ENCODING));
                stOut.Write(dadosDoPost);
                stOut.Close();

                // Recebe
                StreamReader stIn =
                    new StreamReader(req.GetResponse().GetResponseStream(), Encoding.GetEncoding(Constantes.ENCODING));
                string Result = stIn.ReadToEnd();
                stIn.Close();

                // Monta o retorno
                if (Result == Constantes.VERIFICADO)
                {
                    // O post foi validado
                    return new ResultadoDaValidacao(StatusDaValidacao.Verificado); 
                }
                else if (Result == Constantes.FALSO)
                {
                    // O post nao foi validado
                    return new ResultadoDaValidacao(StatusDaValidacao.Falso);
                }
                else
                {
                    // Erro na integração com PagSeguro.
                    return new ResultadoDaValidacao(StatusDaValidacao.ErroComunicacao);
                }
            }
            catch (Exception ex)
            {
                return new ResultadoDaValidacao(StatusDaValidacao.ErroComunicacao) { Excecao = ex };
            }
        }
    }
}